package com.ypaco.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window.Location;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Hidden;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.xml.client.Document;
import com.google.gwt.xml.client.Node;
import com.ypaco.ajax.client.*;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */

public class register_form implements EntryPoint {
	
	class Monitor
	{
	  private HTML ht=null;
	  public Monitor(HTML htm){ht=htm;}
	  public void text(String str){ht.setHTML(str);}
	  public void error(String err){ht.setHTML("<font color=\"red\">"+err+"</font>");}
	  public void exception(Throwable ex){error(ex.getMessage());}
	}
	interface timerCallback
	{
		public void onTimer(TextBox box);
	}
	class fireTimer extends Timer
	{
		private TextBox box=null;
		private timerCallback cb=null;
		public fireTimer(timerCallback callback)
		{
			regbtn.setEnabled(false);
			cb=callback;
		}
		public void fire(TextBox bx,int millis)
		{
			smon.text("Проверка...");
			if (box==bx)
			{
				cancel();
			}
			box=bx;
			schedule(millis);
		}
		public void run() {
			smon.text("");
			cb.onTimer(box);
			box=null;
		}
	}
	final TextBox email=new TextBox();
	final PasswordTextBox pswd1=new PasswordTextBox();
	final PasswordTextBox pswd2=new PasswordTextBox();
	final HTML mon=new HTML();
	final Button regbtn=new Button("Зарегистрироваться");
	final TextBox ctext=new TextBox();
	final Image cimage=new Image();
	final Button cbtn=new Button("Обновить");
	final Monitor smon=new Monitor(mon);
	private Integer captchaid=0;
	public boolean emailok=false;
	public boolean pswdok=false;
	public boolean captchaok=false;
	private fireTimer timer=null;
	final Button reg2btn=new Button("Зарегистрироваться");
	final HTML helptxt=new HTML();
	final TextBox vercode=new TextBox();
	final Hidden hdn=new Hidden();
	
	
	final RemoteXML rq=new RemoteXML(OSServers.ttserver()+"/register.php","POST");
	
	public void setForm()
	{
		Grid g=new Grid(7,2);
		g.setWidth("400px");
		g.setWidget(0, 0, new Label("E-mail адрес:"));
		g.setWidget(0, 1, email);
		g.setWidget(1, 0, new Label("Пароль:"));
		g.setWidget(1, 1, pswd1);
		g.setWidget(2, 0, new Label("Подтверждение пароля:"));
		g.setWidget(2, 1, pswd2);
		g.setWidget(3, 0, cbtn);
		g.setWidget(3, 1, cimage);
		g.setWidget(4, 0, new Label("Символы на катринке:"));
		g.setWidget(4, 1, ctext);
		g.setWidget(5, 1, mon);
		g.setWidget(6, 1, regbtn);
		RootPanel.get("regform").add(g);
	}
	
	public void setEndForm(String semail)
	{
		//Location.assign(OSServers.ttserver()+"/register.php?confirm=&email="+semail);
		RootPanel.get("regform").clear();
		VerticalPanel vp=new VerticalPanel();
		vp.setWidth("400px");
		helptxt.setHTML("На e-mail адрес "+semail+" было отправлено письмо с кодом подтверждения регистрации. Скопируйте код из письма и вставьте в форму ниже.<br/><br/>");
		vp.add(helptxt);
		hdn.setValue(semail);
		vp.add(hdn);
		vp.add(new Label("Код подтверждения:"));
		vp.add(vercode);
		smon.text("");
		vp.add(mon);
		vp.add(reg2btn);
		RootPanel.get("regform").add(vp);
	}
	
	public void setDoneForm()
	{
		Location.assign(OSServers.ttserver()+"/register.php?action=done");
	}
	
	public void onModuleLoad() {
		setForm();
		cbtn.addClickHandler(new ClickHandler(){
			public void onClick(ClickEvent event) {
				updateCaptcha();
			}
		});
		regbtn.setEnabled(false);
		timer=new fireTimer(new timerCallback(){
			public void onTimer(TextBox box) {
				checkAll(box);
			}
		});
		email.addKeyUpHandler(new KeyUpHandler(){
			public void onKeyUp(KeyUpEvent event) {
				timer.fire(email, 1500);
			}
		});
		pswd1.addKeyUpHandler(new KeyUpHandler(){
			public void onKeyUp(KeyUpEvent event) {
				timer.fire(pswd1, 500);
			}
		});
		pswd2.addKeyUpHandler(new KeyUpHandler(){
			public void onKeyUp(KeyUpEvent event) {
				timer.fire(pswd2, 500);
			}
		});
		ctext.addKeyUpHandler(new KeyUpHandler(){
			public void onKeyUp(KeyUpEvent event) {
				timer.fire(ctext, 3000);
			}
		});
		regbtn.addClickHandler(new ClickHandler(){
			public void onClick(ClickEvent event) {
				String data="email="+email.getText()+"&pswd="+pswd1.getText()+"&code="+ctext.getText();
				rq.request(data, new RemoteXMLRequestCallback(){
					public void onFailure(Throwable ex) {
						smon.exception(ex);
					}
					public void onSuccess(Document xml) {
						try{
							XmlProcessor xp=new XmlProcessor(xml);
							Node rt=xp.getRootNode("result");
							String vl=xp.getNeedAttr(rt, "r").getNodeValue();
							if (vl.compareTo("0")==0)
							{
								setEndForm(email.getText());
							}else if (vl.compareTo("1")==0  || vl.compareTo("2")==0)
							{
								updateCaptcha();
								smon.error("Неверный код подтверждения");
							}else if (vl.compareTo("3")==0)
							{
								smon.error("Неверный E-Mail адрес");
							}else{
								smon.error("Ошибка cервера регистрации "+vl);
							}
						}catch(Throwable ex)
						{
							smon.exception(ex);
						}
					}
				
				});
			}
		});
		reg2btn.addClickHandler(new ClickHandler(){
			public void onClick(ClickEvent event) {
				String data="xemail="+hdn.getValue()+"&confirm="+vercode.getText();
				rq.request(data, new RemoteXMLRequestCallback(){
					public void onFailure(Throwable ex) {
						smon.exception(ex);
					}
					public void onSuccess(Document xml) {
						try{
							XmlProcessor xp=new XmlProcessor(xml);
							Node rt=xp.getRootNode("result");
							String vl=xp.getNeedAttr(rt, "r").getNodeValue();
							if (vl.compareTo("0")==0)
							{
								setDoneForm();
							}else if (vl.compareTo("1")==0)
							{
								updateCaptcha();
								smon.error("Неверный код подтверждения");
							}else{
								smon.error("Ошибка cервера регистрации");
							}
						}catch(Throwable ex)
						{
							smon.exception(ex);
						}
					}
				
				});
			}
		});
	}

	public void updateCaptcha()
	{
		cimage.setUrl(OSServers.ttserver()+"/register.php?captcha="+captchaid.toString());
		captchaid++;
		ctext.setValue("");
		ctext.setFocus(true);
	}
	
	public void checkAll(TextBox box)
	{
			emailok=(email.getValue().matches("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.([A-Za-z]{2}|com|info|net|gov|org)$"));
			if (!emailok)
			{	
				smon.error("Неверный E-Mail адрес");
				return;
			}
			regbtn.setEnabled(emailok && pswdok && captchaok);
			pswdok=!pswd1.getValue().isEmpty();
			if (!pswdok)
			{
				smon.error("Пустой пароль");
				return;
			}
			pswdok=(pswd1.getValue().compareTo(pswd2.getValue())==0);
			if (!pswdok)
			{
				smon.error("Пароли не совпадают");
				return;
			}
			regbtn.setEnabled(emailok && pswdok && captchaok);
		if (!box.getValue().isEmpty())
		{
			smon.text("Проверка...");
			rq.request("testcaptcha="+ctext.getValue()+"&username="+email.getValue(), new RemoteXMLRequestCallback(){
				public void onFailure(Throwable ex) {
					smon.exception(ex);
					captchaok=false;
					regbtn.setEnabled(emailok && pswdok && captchaok);
					updateCaptcha();
				}
				public void onSuccess(Document xml) {
					try{
						XmlProcessor xp=new XmlProcessor(xml);
						Node rt=xp.getRootNode("result");
						String res=xp.getNeedAttr(rt, "r").getNodeValue();
						captchaok=(res.compareTo("0")==0);
						if (!captchaok)
						{
							smon.error("Неверный код подтверждения");
							if (res.compareTo("2")==0)
								updateCaptcha();
							if (res.compareTo("3")==0)
							{
								updateCaptcha();
								smon.error("Пользователь с таким e-mail уже существует");
							}
						}else{
							smon.text("");
						}
						regbtn.setEnabled(emailok && pswdok && captchaok);
					}catch(Throwable ex)
					{
						smon.exception(ex);
						captchaok=false;
						regbtn.setEnabled(emailok && pswdok && captchaok);
						updateCaptcha();
					}
				}
			});
		}
	}
	
}
